Telegram Group & Telegram Channel
Анти-функциональные опции в Go

Часто в Go можно встретить такую конструкцию:


type Options struct {
Timeout time.Duration
Retries int
Logger *log.Logger
}

func DoSomething(ctx context.Context, opts Options) error {
if opts.Timeout == 0 {
opts.Timeout = 5 * time.Second
}
if opts.Retries == 0 {
opts.Retries = 3
}
if opts.Logger == nil {
opts.Logger = log.Default()
}

// дальше используем opts
}


На первый взгляд — удобно. Но на практике это ведёт к скрытым багам и неочевидному поведению. Почему?

🔸 Проблема 1: нулевое значение может быть валидным

Допустим, я хочу отключить ретраи и передаю Retries: 0. Но функция решает, что "ноль — это дефолт", и перезаписывает его на 3. В итоге получается поведение, которого явно не хотел.

🔸 Проблема 2: смешение ответственности

Функция DoSomething теперь делает больше, чем нужно: она и бизнес-логику выполняет, и значения инициализирует. Это противоречит принципу единственной ответственности и усложняет тестирование.

🔸 Проблема 3: дублирование

Если в коде много таких функций, каждая будет по-своему инициализировать Options. Это ведёт к дублированию и рассыпанной логике дефолтов.


💡 Что делать?

Вынеси дефолтные значения в отдельную функцию:


func DefaultOptions() Options {
return Options{
Timeout: 5 * time.Second,
Retries: 3,
Logger: log.Default(),
}
}


Теперь клиентский код выглядит явно:


opts := DefaultOptions()
opts.Retries = 0 // без ретраев

DoSomething(ctx, opts)


https://rednafi.com/go/dysfunctional_options_pattern/

👉 @golang_lib



tg-me.com/golang_lib/492
Create:
Last Update:

Анти-функциональные опции в Go

Часто в Go можно встретить такую конструкцию:


type Options struct {
Timeout time.Duration
Retries int
Logger *log.Logger
}

func DoSomething(ctx context.Context, opts Options) error {
if opts.Timeout == 0 {
opts.Timeout = 5 * time.Second
}
if opts.Retries == 0 {
opts.Retries = 3
}
if opts.Logger == nil {
opts.Logger = log.Default()
}

// дальше используем opts
}


На первый взгляд — удобно. Но на практике это ведёт к скрытым багам и неочевидному поведению. Почему?

🔸 Проблема 1: нулевое значение может быть валидным

Допустим, я хочу отключить ретраи и передаю Retries: 0. Но функция решает, что "ноль — это дефолт", и перезаписывает его на 3. В итоге получается поведение, которого явно не хотел.

🔸 Проблема 2: смешение ответственности

Функция DoSomething теперь делает больше, чем нужно: она и бизнес-логику выполняет, и значения инициализирует. Это противоречит принципу единственной ответственности и усложняет тестирование.

🔸 Проблема 3: дублирование

Если в коде много таких функций, каждая будет по-своему инициализировать Options. Это ведёт к дублированию и рассыпанной логике дефолтов.


💡 Что делать?

Вынеси дефолтные значения в отдельную функцию:


func DefaultOptions() Options {
return Options{
Timeout: 5 * time.Second,
Retries: 3,
Logger: log.Default(),
}
}


Теперь клиентский код выглядит явно:


opts := DefaultOptions()
opts.Retries = 0 // без ретраев

DoSomething(ctx, opts)


https://rednafi.com/go/dysfunctional_options_pattern/

👉 @golang_lib

BY Библиотека Go (Golang) разработчика




Share with your friend now:
tg-me.com/golang_lib/492

View MORE
Open in Telegram


Библиотека Go Golang разработчика Telegram | DID YOU KNOW?

Date: |

Telegram announces Search Filters

With the help of the Search Filters option, users can now filter search results by type. They can do that by using the new tabs: Media, Links, Files and others. Searches can be done based on the particular time period like by typing in the date or even “Yesterday”. If users type in the name of a person, group, channel or bot, an extra filter will be applied to the searches.

Can I mute a Telegram group?

In recent times, Telegram has gained a lot of popularity because of the controversy over WhatsApp’s new privacy policy. In January 2021, Telegram was the most downloaded app worldwide and crossed 500 million monthly active users. And with so many active users on the app, people might get messages in bulk from a group or a channel that can be a little irritating. So to get rid of the same, you can mute groups, chats, and channels on Telegram just like WhatsApp. You can mute notifications for one hour, eight hours, or two days, or you can disable notifications forever.

Библиотека Go Golang разработчика from sg


Telegram Библиотека Go (Golang) разработчика
FROM USA